// 封装axios
// 导入axios
import axios from "axios";
import webConfig from "@/global.config";

/* 
请求配置：
url 是用于请求的服务器 URL
method 是创建请求时使用的方法（默认是get）
baseURL 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL，地址的前缀
headers 是即将被发送的自定义请求头 
data 是作为请求主体被发送的数据
timeout 指定请求超时的毫秒数(0 表示无超时时间),如果请求花费了超过timeout时间，请求被中断。
responseType 表示服务器响应的数据类型（默认就是 json）
auth 表示应该使用 HTTP 基础验证，并提供凭据。这将设置一个 `Authorization` 头，
    覆写掉现有的任意使用 `headers` 设置的自定义 `Authorization`头

还有很多，其他的可查阅文档（https://www.kancloud.cn/luponu/axios/873153）......
*/

const request: any = axios.create({
  baseURL: "/mock",
  timeout: 3000,
  headers: {
    customHead: "YAN-AN-DUO-BU",
  },
});

// 添加请求拦截器
request.interceptors.request.use(
  (config: any) => {
    // token设置
    const whiteList = webConfig.whiteListApi;
    const url = config.url;
    const token = localStorage.getItem("token");
    // const type = config.type;
    // 判断请求的这个url地址是不是在白名单中
    // 如果不在白名单，但是token有值，代表就是已经登录过的了。反之就是不在白名单，也没有登录
    if (whiteList.indexOf(url) === -1 && token) {
      config.headers.Authorization = token;
    }
    // 有些项目添加秘钥 + 特殊算法（md5，base64）
    return config;
  },
  (error: any) => {
    return Promise.reject(new Error(error));
  }
);

// 添加响应拦截器
// ***************************************************后期吧alert换成框架里面的弹框提示
request.interceptors.response.use(
  (res: any) => {
    // 根据返回的状态做对应的操作，比如:404,401,500...
    const status = res.status || 200; // 默认设置返回的状态是200。
    const message = res.statusText || "不知道错在哪里";
    if (status == 401) {
      // 如果你没有权限，跳转到登录页面登录以后再请求接口
      alert("你没有权限");
      // return Promise.reject(new Error(message));
    } else if (status == 500) {
      alert("服务器错误");
      // return Promise.reject(new Error(message));
    }
    if (status != 200) {
      // 只要状态码不是200，就是报错的，提示+提示信息
      alert("错误码" + status + "    " + message);
      // return Promise.reject(new Error(message));
    }

    return res.data;
  },
  (error: any) => {
    return Promise.reject(new Error(error));
  }
);

export default request;
